//BeanCipher - Bean Cipher Security Layer
//Copyright (C) 2005 Raul Alfredo Bajales
//
//This library is free software; you can redistribute it and/or
//modify it under the terms of the GNU Lesser General Public
//License as published by the Free Software Foundation; either
//version 2.1 of the License, or (at your option) any later version.
//
//This library is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
//Lesser General Public License for more details.
//
//You should have received a copy of the GNU Lesser General Public
//License along with this library; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package ar.com.rab.beancipher.impl.configuration;

import java.util.ArrayList;
import java.util.List;

import ar.com.rab.beancipher.spi.IBeanDescriptor;
import ar.com.rab.beancipher.spi.IPropertyCipher;
import ar.com.rab.beancipher.spi.IPropertyDescriptor;

/**
 * Implementation of <code>IBeanDescriptor</code> interface.
 * 
 * @see ar.com.rab.beancipher.spi.IBeanDescriptor
 * @author Bajales Raul
 *
 */
public class BeanDescriptor implements Comparable, IBeanDescriptor {
    
    private String beanClassName;
    private IPropertyCipher propertyCipher;
    private List propertyDescriptors;

    /**
     * @param className
     * @param propertyCipher
     */
    public BeanDescriptor(String className, IPropertyCipher propertyCipher) {
        this.beanClassName = className;
        this.propertyCipher = propertyCipher;
        this.propertyDescriptors = new ArrayList();
    }

    /* (non-Javadoc)
     * @see ar.com.rab.beancipher.spi.IBeanDescriptor#addPropertyDescriptor(ar.com.rab.beancipher.spi.IPropertyDescriptor)
     */
    public void addPropertyDescriptor(IPropertyDescriptor propertyDescriptor) {
        this.propertyDescriptors.add(propertyDescriptor);
    }

    /* (non-Javadoc)
     * @see ar.com.rab.beancipher.spi.IBeanDescriptor#addAllPropertyDescriptors(java.util.List)
     */
    public void addAllPropertyDescriptors(List propertyDescriptors) {
        this.propertyDescriptors.addAll(propertyDescriptors);
    }

    /* (non-Javadoc)
     * @see ar.com.rab.beancipher.spi.IBeanDescriptor#getBeanClassName()
     */
    public String getBeanClassName() {
        return beanClassName;
    }
    
    /* (non-Javadoc)
     * @see ar.com.rab.beancipher.spi.IBeanDescriptor#getPropertyCipher()
     */
    public IPropertyCipher getPropertyCipher() {
        return propertyCipher;
    }
    
    /* (non-Javadoc)
     * @see ar.com.rab.beancipher.spi.IBeanDescriptor#getPropertyDescriptors()
     */
    public List getPropertyDescriptors() {
        return propertyDescriptors;
    }
    
    /* (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    public boolean equals(Object object) {
        if (!(object instanceof IBeanDescriptor)) return false;
        BeanDescriptor descriptor = (BeanDescriptor) object;
        return descriptor.beanClassName.equals(this.beanClassName);
    }
    
    /* (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    public int hashCode() {
        return this.beanClassName.hashCode();
    }

    /* (non-Javadoc)
     * @see java.lang.Comparable#compareTo(java.lang.Object)
     */
    public int compareTo(Object object) {
        BeanDescriptor descriptor = (BeanDescriptor) object;
        return this.beanClassName.compareTo(descriptor.beanClassName);
    }
}